import { createVNode, render } from 'vue';
import { initDynamicRoutes } from '@/router/dynamicRoutes';
import router from './router/index';
import loadingBar from '@/component/loadingBar.vue';
import Cookies from 'js-cookie'; // 引入 js-cookie
import { useRouteStore } from '@/store/index';
import menuData from '/public/dynamicRouter.json'; // 导入动态菜单数据
 
const whileList = ['/login']; // 白名单
const Vnode = createVNode(loadingBar);
render(Vnode, document.body);
 
router.beforeEach(async (to, from, next) => {
  const routeStore = useRouteStore(); // 获取 Pinia 中的路由状态
  const token = Cookies.get('token'); // 从 cookie 获取 token
 
  // 判断是否有 token，存在则说明用户已登录
  if (token) {
    // 检查是否已经加载过动态路由
    if (routeStore.dynamicRoutes.length === 0) {
      // 检查是否有持久化的动态路由
      const persistedRoutes = sessionStorage.getItem('dynamicRoutes');  // 使用 sessionStorage
      if (persistedRoutes) {
        // 如果有持久化的动态路由，直接从 sessionStorage 加载
        const routerList = JSON.parse(persistedRoutes);
        initDynamicRoutes(routerList); // 动态初始化路由
        routeStore.setDynamicRoutes(routerList); // 将动态路由存入 Pinia
        next({ ...to, replace: true }); // 确保动态路由加载后再跳转
        Vnode.component?.exposed?.startLoading(); // 启动加载条
      } else {
        // 如果没有持久化的动态路由，则使用静态的 dynamicRouter.json
        const dynamicRoutes = initDynamicRoutes(menuData); // 动态初始化路由
        if (dynamicRoutes !== undefined) {
          routeStore.setDynamicRoutes(dynamicRoutes); // 将动态路由存入 Pinia
          sessionStorage.setItem('dynamicRoutes', JSON.stringify(dynamicRoutes)); // 存储动态路由到 sessionStorage
          next({ ...to, replace: true }); // 确保动态路由加载后再跳转
          Vnode.component?.exposed?.startLoading(); // 启动加载条
        } else {
          next('/login'); // 如果没有动态路由信息，跳转到登录页面
        }
      }
    } else {
      next(); // 如果已经加载过动态路由，直接跳转
    }
  } else {
    // 如果没有 token，判断是否在白名单中
    if (whileList.includes(to.path)) {
      next(); // 白名单路由放行
    } else {
      next('/login'); // 否则跳转到登录页
    }
  }
});
 
router.afterEach(() => {
  Vnode.component?.exposed?.endLoading(); // 结束加载条
});